package modifyx

type IModify interface {
	Key() string
	Valid() bool
	Value(old interface{}) (last interface{})
}

//
//// 由于公式的不可控，每次执行公式，版本号自动加一，即每次调用公式影响的字段，都会重新计算
//// todo: 对于某些公式只需要计算一次的情况，增加一个配置
//type IModifyFormula interface {
//	IModify
//	Name() string
//	Args() string
//}
//
//type IModifyFloat interface {
//	IModify
//	Kind() string
//	Value() float64
//}
//
//type Modify struct {
//	// 例如: CEffectDamage/Amount
//	key string
//}
//
//func (a *Modify) Valid() bool {
//	return true
//}
//
//func (b *Modify) SetKey(val string) *Modify {
//	b.key = val
//	return b
//}
//
//func (m *Modify) Key() string {
//	return m.key
//}
//
//// 修正浮点数
//type ModifyFormula struct {
//	//
//	Modify
//	// 公式
//	// Cmd arg0 arg1
//	name string
//	//
//	args string
//}
//
//func (b *ModifyFormula) SetName(val string) *ModifyFormula {
//	b.name = val
//	return b
//}
//
//func (m *ModifyFormula) Name() string {
//	return m.name
//}
//
//func (b *ModifyFormula) SetArgs(val string) *ModifyFormula {
//	b.args = val
//	return b
//}
//
//func (m *ModifyFormula) Args() string {
//	return m.args
//}
//
//// 修正浮点数
//type ModifyFloat struct {
//	//
//	Modify
//	// 修正类型
//	// enums.ModifyFloatKind
//	kind string
//	// 修正值
//	value float64
//}
//
//func (b *ModifyFloat) SetKind(val string) *ModifyFloat {
//	b.kind = val
//	return b
//}
//
//func (m *ModifyFloat) Kind() string {
//	return m.kind
//}
//
//func (b *ModifyFloat) SetValue(val float64) *ModifyFloat {
//	b.value = val
//	return b
//}
//
//func (m *ModifyFloat) Value() float64 {
//	return m.value
//}
//
//var formulas = map[string]func(x interface{}, cmd string, args ...string) interface{}{}
//
//func RegisterFormulas(key string, f func(x interface{}, cmd string, args ...string) interface{}) {
//	formulas[key] = f
//}
//
//func CalculateModifyFormula(x float64, bonus IModifyFormula) (y float64) {
//	name := bonus.Name()
//	if name == "" {
//		return x
//	}
//	f, has := formulas[name]
//	if !has {
//		return x
//	}
//	args := strings.Split(bonus.Args(), ",")
//	y = f(x, name, args...).(float64)
//	return
//}
//
//func CalculateModifyFloat(x float64, bonus IModifyFloat) (y float64) {
//	switch bonus.Kind() {
//	case "Add":
//		x += bonus.Value()
//	case "Sub":
//		x -= bonus.Value()
//	case "Mul":
//		x *= bonus.Value()
//	case "Div":
//		x /= bonus.Value()
//	case "Set":
//		x = bonus.Value()
//		//case enums.BonusFixFloatKind_Formula:
//		//	f, has := formulas[bonus.Formula]
//		//	if has {
//		//		x = f(x, params).(float64)
//		//	}
//	}
//	y = x
//	return
//}
